home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / lib / spin.c < prev   
C/C++ Source or Header  |  1995-05-03  |  4KB  |  134 lines

  1. /*************************************************************************
  2.  *                                                                       *
  3.  *  Copyright (c) 1992, 1993 Ronald Joe Record                           *
  4.  *                                                                       *
  5.  *  All rights reserved. No part of this program or publication may be   *
  6.  *  reproduced, transmitted, transcribed, stored in a retrieval system,  *
  7.  *  or translated into any language or computer language, in any form or *
  8.  *  by any means, electronic, mechanical, magnetic, optical, chemical,   *
  9.  *  biological, or otherwise, without the prior written permission of:   *
  10.  *                                                                       *
  11.  *      Ronald Joe Record (408) 458-3718                                 *
  12.  *      212 Owen St., Santa Cruz, California 95062 USA                   *
  13.  *                                                                       *
  14.  *************************************************************************/
  15.  
  16. #include <X11/Xlib.h>
  17.  
  18. #ifdef USE_DELAY
  19.  
  20. #include <signal.h>
  21. #include <sys/time.h>
  22.  
  23. static int timerdone;
  24.  
  25. static void onalarm() {
  26.     timerdone = 1;
  27. }
  28.  
  29. /*******/
  30. void Timer(n)   /* waits for 'n' milliseconds (from xv-2.21 source) */
  31.  int  n;
  32. /*******/
  33. {
  34.   long usec;
  35. #ifdef HAS_ITIMER
  36.   struct itimerval it;
  37. #endif
  38.  
  39.   if (!n) return;
  40.  
  41.   usec = (long) n * 1000;
  42.   
  43. #ifdef HAS_ITIMER
  44.   memset(&it, 0, sizeof(it));
  45.   if (usec>=1000000L) {  /* more than 1 second */
  46.     it.it_value.tv_sec = usec / 1000000L;
  47.     usec %= 1000000L;
  48.   }
  49.  
  50.   it.it_value.tv_usec = usec;
  51. #endif
  52.   timerdone=0;
  53.   signal(SIGALRM,onalarm);
  54. #ifdef HAS_ITIMER
  55.   setitimer(ITIMER_REAL, &it, (struct itimerval *)0);
  56.   while (1) {
  57. /*    sigblock(sigmask(SIGALRM));  note:  have to block, so that ALRM */
  58.     if (timerdone) break;        /* doesn't occur between 'if (timerdone)' */
  59.     else sigpause(0);            /* and calling sigpause(0) */
  60.   }
  61.  
  62. /*  sigblock(0);                    turn ALRM blocking off */
  63.   signal(SIGALRM,SIG_DFL);
  64. #else
  65.   nap((long)n);
  66. #endif
  67. }
  68.  
  69. #endif /*USE_DELAY */
  70.  
  71. void
  72. Spin(display, colormap, colors, start_color, num_colors, delay, dir)
  73. Display *display;
  74. Colormap colormap;
  75. XColor *colors;
  76. int start_color, num_colors;
  77. short dir, delay;
  78. {
  79.     static short i;
  80.     static long tmpxcolor;
  81.  
  82.     while (!XPending(display)) {
  83.         if (dir) {
  84.             tmpxcolor = colors[start_color].pixel;
  85.             for (i=start_color;i<num_colors-1;i++)
  86.                 colors[i].pixel = colors[i+1].pixel;
  87.             colors[num_colors-1].pixel = tmpxcolor;
  88.         }
  89.         else {
  90.             tmpxcolor = colors[num_colors-1].pixel;
  91.             for (i=num_colors-1;i>start_color;i--)
  92.                 colors[i].pixel = colors[i-1].pixel;
  93.             colors[start_color].pixel = tmpxcolor;
  94.         }
  95.         XStoreColors(display, colormap, colors, num_colors);
  96. #ifdef USE_DELAY
  97.     Timer(delay);
  98. #endif
  99.     }
  100. }
  101.  
  102. void
  103. DemoSpin(display, colormap, colors, start_color, num_colors, delay, factor)
  104. Display *display;
  105. Colormap colormap;
  106. XColor *colors;
  107. int start_color, num_colors;
  108. short delay, factor;
  109. {
  110.     static short i, j;
  111.     long tmpxcolor;
  112.  
  113.     for (j=0;j<factor*num_colors;j++) {
  114.         tmpxcolor = colors[start_color].pixel;
  115.         for (i=start_color;i<num_colors-1;i++)
  116.             colors[i].pixel = colors[i+1].pixel;
  117.         colors[num_colors-1].pixel = tmpxcolor;
  118.         XStoreColors(display, colormap, colors, num_colors);
  119. #ifdef USE_DELAY
  120.     Timer(delay);
  121. #endif
  122.     }
  123.     for (j=0;j<factor*num_colors;j++) {
  124.         tmpxcolor = colors[num_colors-1].pixel;
  125.         for (i=num_colors-1;i>start_color;i--)
  126.             colors[i].pixel = colors[i-1].pixel;
  127.         colors[start_color].pixel = tmpxcolor;
  128.         XStoreColors(display, colormap, colors, num_colors);
  129. #ifdef USE_DELAY
  130.     Timer(delay);
  131. #endif
  132.     }
  133. }
  134.